from flask import Flask

from config import Config
from internal.router import Router
from pkg.response import json, Response, HttpCode
from internal.exception import CustomException
import os
from flask_sqlalchemy import SQLAlchemy
from internal.model import App
class Http(Flask):
    def __init__(self, *args, config: Config, db:SQLAlchemy, router: Router, **kwargs):
        # 1.调用父类初始化函数
        super().__init__(*args, **kwargs)

         # 2.配置应用
        self.config.from_object(config)

     # 3.注册绑定异常错误处理
        self.register_error_handler(Exception, self._register_error_handler)
   
      # 数据库的初始化
        db.init_app(self)
        with self.app_context():
            _= App()
            db.create_all()

        # 4.注册应用路由
        router.register_router(self)

        
      
       
        
    def _register_error_handler(self, error: Exception):     
        # 1.异常信息是不是我们的自定义异常，如果是可以提取message和code等信息
        if isinstance(error, CustomException):
            return json(Response(
                code=error.code,
                message=error.message,
                data=error.data if error.data is not None else {},
            ))
        # 2.如果不是我们的自定义异常，则有可能是程序、数据库抛出的异常，也可以提取信息，设置为FAIL状态码
        if self.debug or os.getenv("FLASK_ENV") == "development" :
            raise error
        else:
            return json(Response(
                code=HttpCode.FAIL,
                message=str(error),
                data={},
            ))
   